package com.geo.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.geo.entity.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 用户实体类
 * 定义用户信息和权限相关字段
 * 
 * @author GEO Team
 * @version 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
public class User extends BaseEntity {
    
    /**
     * 用户名 - 唯一标识
     */
    @TableField("username")
    private String username;
    
    /**
     * 密码 - 已加密
     */
    @TableField("password")
    private String password;
    
    /**
     * 盐值 - 密码加密
     */
    @TableField("salt")
    private String salt;
    
    /**
     * 邮箱 - 唯一标识
     */
    @TableField("email")
    private String email;
    
    /**
     * 手机号码
     */
    @TableField("phone")
    private String phone;
    
    /**
     * 昵称
     */
    @TableField("nickname")
    private String nickname;
    
    /**
     * 真实姓名
     */
    @TableField("real_name")
    private String realName;
    
    /**
     * 头像URL
     */
    @TableField("avatar_url")
    private String avatarUrl;
    
    /**
     * 性别 - M:男 F:女 U:未知
     */
    @TableField("gender")
    private String gender;
    
    /**
     * 生日
     */
    @TableField("birthday")
    private LocalDateTime birthday;
    
    /**
     * 用户类型 - ADMIN:管理员 BUSINESS:企业用户 PERSONAL:个人用户
     */
    @TableField("user_type")
    private String userType;
    
    /**
     * 用户状态 - ACTIVE:激活 INACTIVE:未激活 LOCKED:锁定 DISABLED:禁用
     */
    @TableField("status")
    private String status;
    
    /**
     * 最后登录时间
     */
    @TableField("last_login_time")
    private LocalDateTime lastLoginTime;
    
    /**
     * 最后登录IP
     */
    @TableField("last_login_ip")
    private String lastLoginIp;
    
    /**
     * 登录次数
     */
    @TableField("login_count")
    private Integer loginCount;
    
    /**
     * 邮箱验证状态 - 0:未验证 1:已验证
     */
    @TableField("email_verified")
    private Integer emailVerified;
    
    /**
     * 手机验证状态 - 0:未验证 1:已验证
     */
    @TableField("phone_verified")
    private Integer phoneVerified;
    
    /**
     * 两步验证启用状态 - 0:未启用 1:已启用
     */
    @TableField("two_factor_enabled")
    private Integer twoFactorEnabled;
    
    /**
     * 用户偏好设置 - JSON格式
     */
    @TableField("preferences")
    private String preferences;
    
    /**
     * 用户标签 - 逗号分隔
     */
    @TableField("tags")
    private String tags;
    
    /**
     * 个人简介
     */
    @TableField("bio")
    private String bio;
    
    /**
     * 公司名称
     */
    @TableField("company")
    private String company;
    
    /**
     * 职位
     */
    @TableField("position")
    private String position;
    
    /**
     * 地址
     */
    @TableField("address")
    private String address;
    
    /**
     * 城市
     */
    @TableField("city")
    private String city;
    
    /**
     * 国家
     */
    @TableField("country")
    private String country;
    
    /**
     * 时区
     */
    @TableField("timezone")
    private String timezone;
    
    /**
     * 语言偏好
     */
    @TableField("language")
    private String language;
    
    /**
     * 账户过期时间
     */
    @TableField("account_expire_time")
    private LocalDateTime accountExpireTime;
    
    /**
     * 密码过期时间
     */
    @TableField("password_expire_time")
    private LocalDateTime passwordExpireTime;
    
    /**
     * 密码错误次数
     */
    @TableField("password_error_count")
    private Integer passwordErrorCount;
    
    /**
     * 账户锁定时间
     */
    @TableField("lock_time")
    private LocalDateTime lockTime;
    
    /**
     * 注册来源 - WEB:网页 APP:移动应用 API:接口 ADMIN:管理员创建
     */
    @TableField("register_source")
    private String registerSource;
    
    /**
     * 注册IP
     */
    @TableField("register_ip")
    private String registerIp;
    
    /**
     * 激活码
     */
    @TableField("activation_code")
    private String activationCode;
    
    /**
     * 重置密码令牌
     */
    @TableField("reset_token")
    private String resetToken;
    
    /**
     * 重置密码令牌过期时间
     */
    @TableField("reset_token_expire_time")
    private LocalDateTime resetTokenExpireTime;
    
    /**
     * 用户类型常量
     */
    public static class UserType {
        public static final String ADMIN = "ADMIN";                 // 管理员
        public static final String BUSINESS = "BUSINESS";           // 企业用户
        public static final String PERSONAL = "PERSONAL";           // 个人用户
    }
    
    /**
     * 用户状态常量
     */
    public static class Status {
        public static final String ACTIVE = "ACTIVE";               // 激活
        public static final String INACTIVE = "INACTIVE";           // 未激活
        public static final String LOCKED = "LOCKED";               // 锁定
        public static final String DISABLED = "DISABLED";           // 禁用
    }
    
    /**
     * 性别常量
     */
    public static class Gender {
        public static final String MALE = "M";                      // 男
        public static final String FEMALE = "F";                    // 女
        public static final String UNKNOWN = "U";                   // 未知
    }
    
    /**
     * 注册来源常量
     */
    public static class RegisterSource {
        public static final String WEB = "WEB";                     // 网页
        public static final String APP = "APP";                     // 移动应用
        public static final String API = "API";                     // 接口
        public static final String ADMIN = "ADMIN";                 // 管理员创建
    }
}